package org.example.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.example.mapper.EmpExprMapper;
import org.example.mapper.EmpMapper;
import org.example.pojo.*;
import org.example.service.EmpService;
import org.example.util.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;

    /**
     * 分页查询员工信息
     * @param empQueryParam
     * @return
     */
    @Override
    public PageResult pageQuery(EmpQueryParam empQueryParam) {
        PageHelper.startPage(empQueryParam.getPage(),empQueryParam.getPageSize());
        Page<Emp> page=empMapper.pageQuery(empQueryParam);
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 添加员工
     * @param emp
     */
    @Transactional
    @Override
    public void insert(Emp emp) {
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.insert(emp);
        //获取员工id
        Integer empId = emp.getId();
        //获取员工工作经历列表
        List<EmpExpr> exprList = emp.getExprList();
        //如果 没有填写工作经历 就不用添加工作经历
        if(exprList == null || exprList.size() == 0){
            return;//不用继续了
        }

        for (EmpExpr empExpr : exprList) {
            empExpr.setEmpId(empId);//给员工工作经历设置员工id
        }
        //循环做完 exprList 里面的数据都加好了 empId 可以完成批量添加了
        empExprMapper.insertBatch(exprList);
    }



    /**
     * 查询所有员工
     * @return
     */
    @Override
    public List<Emp> selectAll() {
        List<Emp> list=empMapper.selectAll();
        return list;
    }


    /**
     * 批量删除员工
     * @param ids
     */
    @Transactional
    @Override
    public void deleteBatch(List<Integer> ids) {
        empMapper.deleteByIds(ids);
        List<Integer> empIds = ids;
        empExprMapper.deleteByEmpIds(empIds);
    }

    /**
     * 根据id查询员工
     * @param id
     * @return
     */
    @Override
    public Emp getInfo(Integer id) {
        Emp emp=empMapper.selectById(id);
        Integer empId = emp.getId();
        List<EmpExpr> exprList = empExprMapper.listByEmpId(empId);
        emp.setExprList(exprList);
        return emp;
    }

    /**
     * 修改员工信息
     * @param emp
     */
    @Override
    @Transactional
    public void update(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateById(emp);
        empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
        Integer empId = emp.getId();
        List<EmpExpr> exprList = emp.getExprList();
        if(exprList == null || exprList.size() == 0){
            return ;
        }
        for (EmpExpr expr : exprList) {
            expr.setEmpId(empId);
        }
        empExprMapper.insertBatch(exprList);//  List<EmpExpr>
    }

    /**
     * 根据部门id查询员工
     * @param id
     * @return
     */
    @Override
    public List<Emp> selectByDeptId(Integer id) {
        return empMapper.selectByDeptId(id);
    }


    @Override
    public LoginInfo login(Emp emp) {
        //参数 emp 是载体 username password 的载体
        //  根据用户名和密码 查询 登录用户详情信息
        Emp loginEmp = empMapper.getByUsernameAndPassword(emp);//传递的emp是载体
        if(loginEmp!=null){
            LoginInfo loginInfo = new LoginInfo();
            loginInfo.setId(loginEmp.getId());
            loginInfo.setUsername(loginEmp.getUsername());
            loginInfo.setName(loginEmp.getName());
            //"这个令牌应该一套防伪技术,当前仅仅做测试"
            // do 待做事项---生成令牌 设置令牌
            //创建一个map集合存储 有效载荷 共享的数据 注意数据不能是私密
            Map<String,Object> claims = new HashMap<>();
            claims.put("id",loginEmp.getId());
            claims.put("username",loginEmp.getUsername());
            String token = JwtUtils.generateJwt(claims);
            loginInfo.setToken(token);
            return loginInfo;
        }
        return null;
    }
}
